#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 5e3 + 10;
int n;
char matrix[maxn][maxn];
bool vis[maxn][maxn];
// 必须是先右下再左上
int nex[4][4]={{0,1}, {1, 0}, {0, -1}, {-1, 0}};


bool dfs(int x, int y){
	if(x==n&&y==n){ // 到达终点
		return true; 
	}
	if(!(x==1&&y==1)){
		vis[x][y]=true;		
	}
	for(int i=0;i<4;i++){
		int nx=x+nex[i][0];
		int ny=y+nex[i][1];
		if(nx<1||nx>n||ny<1||ny>n||vis[nx][ny]||matrix[nx][ny]=='X'){ // 不能走 
			continue;
		}
		if(dfs(nx, ny)){
			return true;
		}
	}
	return false;
	
}

void solve(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>matrix[i][j];
		}
	}
	// 走第一遍, 找到是否有通路
	// 注意第一条路, 要尽可能的是很短的
	// 如果很长的话, 比如将所有的格子都走了一遍才找到, 这样会把每个格子都标记过了
	// 此时就算原本有第二条路也走不通了
	// 要保证尽可能的短就是尽可能的是朝着目标走的, 所以要先朝着右下走
	if(!dfs(1, 1)) {
		cout<<0<<'\n'; // 压根没有通路
		return;
	}
	// 走第二遍, 看是否除了第一条路还有没有路
	// 没有说明有一个点是必走的
	if(!dfs(1,1)){
		// 没有路了
		cout<<1<<'\n';
		return;
	}
	// 还有路, 但是只要把起始点或者终点堵住的话, 就永远不可能走到
	cout<<2<<'\n';
	
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int t;
	cin>>t;
	while(t--){
		memset(vis, 0, sizeof(vis));
		solve();		
	}
	return 0;
}
